/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientRecherche;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.refservcommuns.clients.servperscom.v4.contextevisibilite.DtoContexteVisibilite;
import fr.generali.refservcommuns.rce.searchgenerique.dossier.dossierpersonnesearch.DtoDossierPersonneSearch;
import fr.generali.refservcommuns.rce.searchgenerique.dossier.dossierpersonnesearch.DtoSearchAdressePostale;
import fr.generali.refservcommuns.rce.searchgenerique.dossier.dossierpersonnesearch.DtoSearchPersonne;
import fr.generali.refservcommuns.rce.searchgenerique.dossier.dossierpersonnesearch.DtoSearchTelephone;
import fr.generali.refservcommuns.rce.searchgenerique.recherchepersonnegeneriqueservice.RechercherPersonnesGenerique;

/**
 * Transforme un {@link IClientRecherche} en un {@link RechercherPersonnesGenerique}
 * 
 * @author selrhazala
 */
@Component("clientRecherche2RechercherPersonnesGeneriqueConverter")
public class ClientRecherche2RechercherPersonnesGeneriqueConverter implements
    Converter<IClientRecherche, RechercherPersonnesGenerique> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER =
                    LoggerFactory.getLogger(ClientRecherche2RechercherPersonnesGeneriqueConverter.class);

    /**
     * Taille siret
     */
    private static final int TAILLE_SIRET = 9;

    /**
     * Constante pour la valeur true
     */
    private static final String TRUE = "1";

    /**
     * {@inheritDoc}
     */
    public RechercherPersonnesGenerique convert(IClientRecherche input) {
        LOGGER.info("assemble");
        RechercherPersonnesGenerique request = new RechercherPersonnesGenerique();
        request.setDtoDossierPersonneSearch(new DtoDossierPersonneSearch());
        DtoDossierPersonneSearch dossier = request.getDtoDossierPersonneSearch();
        dossier.setPersonne(new DtoSearchPersonne());
        dossier.setNomWithLike(input.isRechercheLike() ? TRUE : null);
        dossier.setPrenomWithLike(input.isRechercheLike() ? TRUE : null);
        dossier.setVilleWithLike(input.isRechercheLike() ? TRUE : null);
        if (input != null) {
            DtoSearchPersonne personne = dossier.getPersonne();
            personne.setNomGenerique(input.getNom());
            personne.setPrenom(input.getPrenom());
            if (input.getCodePostal() != null) {
                dossier.setAdressePostale(new DtoSearchAdressePostale());
                dossier.getAdressePostale().setCodePostal(input.getCodePostal());

            }

            if (input.getVilleCommune() != null) {

                if (dossier.getAdressePostale() == null) {

                    dossier.setAdressePostale(new DtoSearchAdressePostale());
                }

                dossier.getAdressePostale().setLocalite(input.getVilleCommune());

            }
            
            if (input.getNumeroTelephone() != null) {

                if (dossier.getTelephone() == null) {

                    dossier.setTelephone(new DtoSearchTelephone());
                }

                dossier.getTelephone().setNumero(StringUtils.trim(input.getNumeroTelephone()));

            }

            // SIRET = SIREN (9 car) + NIC (5 car)
            if (input.getSiret() != null) {
                personne.setCodeSIREN(input.getSiret().substring(0, TAILLE_SIRET));
                if (input.getSiret().length() > TAILLE_SIRET) {
                    personne.setCodeNIC(input.getSiret().substring(TAILLE_SIRET, input.getSiret().length()));
                }
            }
            personne.setStatutClient(input.getTypeClient());
            calculerNaturePersonneRCE(input, dossier);

            // Visibilité
            DtoContexteVisibilite visibilite = new DtoContexteVisibilite();
            visibilite.setCodePopulation("ACC");
            visibilite.setCompteAccedant(input.getUserInfo().getCompteAccedant());
            visibilite.setIdIam(input.getUserInfo().getIdIam());
            if (input.getListeCodeIntermediaire() != null) {
                visibilite.getIdIntermediaire().addAll(input.getListeCodeIntermediaire());
            }
            request.setDtoContexteVisibilite(visibilite);
        }

        return request;
    }

    /**
     * Calcule la nature personne et le type personne morale
     * 
     * @param input les paramètres de recherche entrés dans le formulaire
     * @param dossier les paramètres de recherche en entré du webservice
     */
    private void calculerNaturePersonneRCE(IClientRecherche input, DtoDossierPersonneSearch dossier) {
        List<NaturePersonne> listeNaturePersonne = input.getNaturePersonne();

        // Pas de valeur à envoyer si toutes les valeurs sont cochées
        if (listeNaturePersonne != null && listeNaturePersonne.size() != NaturePersonne.values().length) {
            List<String> listeNaturePersonneValues = new ArrayList<String>(listeNaturePersonne.size());
            NaturePersonne naturePersonne;
            for (int i = 0; i < listeNaturePersonne.size(); i++) {
                naturePersonne = listeNaturePersonne.get(i);
                listeNaturePersonneValues.add(naturePersonne.getValue());
            }
            
            
            boolean isRecherchePart = listeNaturePersonneValues.contains(NaturePersonne.PARTICULIER.getValue());
            boolean isRecherchePro = listeNaturePersonneValues.contains(NaturePersonne.PROFESSIONNEL.getValue());
            boolean isRecherchePM = listeNaturePersonneValues.contains(NaturePersonne.ENTREPRISE.getValue())
                                    || listeNaturePersonneValues.contains(NaturePersonne.ASSOCIATION.getValue())
                                    || listeNaturePersonneValues.contains(NaturePersonne.COPROPRIETE.getValue())
                                    || listeNaturePersonneValues.contains(NaturePersonne.COLLECTIVITE.getValue())
                                    || listeNaturePersonneValues.contains(NaturePersonne.AUTRE.getValue());
            
            boolean isSirenRenseigne = dossier.getPersonne() != null 
                                    && StringUtils.isNotEmpty(dossier.getPersonne().getCodeSIREN());
            
            if (isRecherchePart && !isRecherchePro) {
                dossier.getPersonne().setNaturePersonne("PP");
            } else {
                if (isRecherchePro && !isRecherchePart) {
                    dossier.getPersonne().setNaturePersonne("PRO");
                } else {
                    if (isRecherchePro && isRecherchePart) {
                        dossier.getPersonne().setNaturePersonne("PP,PRO");
                    } else if (isRecherchePM) {
                        dossier.getPersonne().setNaturePersonne("PM");
                        
                        StringBuilder natureRce = new StringBuilder("");
                        String nature;
                        for (int i = 0; i < listeNaturePersonneValues.size(); i++) {
                            nature = listeNaturePersonneValues.get(i);
                            natureRce.append(nature);
                            if (i != (listeNaturePersonne.size() - 1)) {
                                natureRce.append(",");
                            }
                        }
                        dossier.getPersonne().setTypePersonneMorale(natureRce.toString());
                    }
                }
            }
            
            if (isSirenRenseigne) {
                dossier.getPersonne().setNaturePersonne(null);
            }
        }
    }
}
